package com.rceeslca.common.utils;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;
import java.util.List;

/**
 * JSON 工具类
 * @author rceeslca
 */
public class JsonUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();


    public static String toJsonString(Object object){
        try{
            return objectMapper.writeValueAsString(object);
        } catch(Exception e){
            throw new RuntimeException(e);
        }
    }


    public static <T> T parseObject(String text,Class<T> clazz){
        if(StrUtil.isEmpty(text)){
            return null;
        }
        try{
            return objectMapper.readValue(text,clazz);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }


    public static <T> T parseObject(byte[] bytes,Class<T> clazz){
        if(ArrayUtil.isEmpty(bytes)){
            return null;
        }
        try{
            return objectMapper.readValue(bytes,clazz);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }


    public static <T> T parseObject(String text,TypeReference<T> typeReference){
        try{
            return objectMapper.readValue(text,typeReference);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }


    public static <T> List<T> parseArray(String text,Class<T> clazz){
        if(StrUtil.isEmpty(text)){
            return new ArrayList<>();
        }
        try{
            return objectMapper.readValue(text,objectMapper.getTypeFactory().constructCollectionType(List.class,clazz));
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

}
